home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Development / 3DMF parser / 1.0 version / MF3DPC / MFSTDCHK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-07  |  4.3 KB  |  198 lines  |  [TEXT/dosa]

  1. /*==============================================================================
  2.  *
  3.  *    File:        MFSTDCHK.C
  4.  *
  5.  *    Function:    Our MF3DProcs which interface to standard C routines.
  6.  *
  7.  *    Version:    Metafile:    Version 1.0 3DMF files
  8.  *                Package:    Release #2 of this code
  9.  *
  10.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  11.  *                John Kelly (JRK), Duet Development Corp.
  12.  *
  13.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  14.  *
  15.  *    Change History (most recent first):
  16.  *        FB8_JRK    Segmentation
  17.  *        Fabio    Changed file name to 8 characters
  18.  *        F31_RWW    Avoid error when reading zero-size objects (binary).
  19.  *        F29_RWW    File created.
  20.  *==============================================================================
  21.  */
  22.  
  23. #include "MFSTDCHK.H"
  24.  
  25. #include <limits.h>
  26. #include <stdio.h>
  27.  
  28. #include "MFERRORS.H"
  29. #include "MFINT64.H"
  30.  
  31. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  32. #pragma segment __MF3D__
  33. #endif
  34.  
  35. MF3DErr
  36. MF3DStdCOpenHook(
  37.     MF3DDataFormatEnum    inDataFormat,
  38.     MF3DUserOpenDataPtr    inOpenDataPtr,
  39.     MF3DUserFilePtr *    outFilePtr)
  40. {
  41.     MF3DUserFilePtr        filePtr;
  42.     MF3DStdCOpenDataPtr    stdCOpenDataPtr;
  43.     MF3DErr                result;
  44.     char                *permissionString;
  45.  
  46.     stdCOpenDataPtr = (MF3DStdCOpenDataPtr)inOpenDataPtr;
  47.     if (MF3DIsTextFormat(inDataFormat))
  48.     {    if (stdCOpenDataPtr->permission == kMF3DStdCReadPerm)
  49.             permissionString = kMF3D_StdCTextReadPermStr;
  50.         else
  51.             permissionString = kMF3D_StdCTextWritePermStr;
  52.     }
  53.     else
  54.     {    if (stdCOpenDataPtr->permission == kMF3DStdCReadPerm)
  55.             permissionString = kMF3D_StdCBinaryReadPermStr;
  56.         else
  57.             permissionString = kMF3D_StdCBinaryWritePermStr;
  58.     }
  59.  
  60.     filePtr = (MF3DUserFilePtr)fopen(stdCOpenDataPtr->filename,
  61.             permissionString);
  62.  
  63.     if (filePtr != NULL)
  64.     {    result = kMF3DNoErr;
  65.         *outFilePtr = filePtr;
  66.     }
  67.     else
  68.     {    result = kMF3DErrFailedToOpen;
  69.     }
  70.  
  71.     return result;
  72. }
  73.  
  74. MF3DErr
  75. MF3DStdCReadHook(
  76.     MF3DUserFilePtr        inFilePtr,
  77.     MF3DSize            inCharsToRead,
  78.     char *                outBuffer)
  79. {
  80.     size_t    bytesRead;
  81.     MF3DErr    result;
  82.  
  83.     result = kMF3DNoErr;
  84.  
  85.     if (inCharsToRead > 0)
  86.     {    bytesRead = fread(outBuffer, sizeof(char), (size_t)inCharsToRead,
  87.                 (FILE *)inFilePtr);
  88.  
  89.         if (bytesRead == 0)
  90.         {    if (feof((FILE *)inFilePtr))
  91.                 result = kMF3DErrReadFailedEOF;
  92.             else
  93.                 result = kMF3DErrReadFailed;
  94.         }
  95.         else if (bytesRead != (size_t)inCharsToRead)
  96.         {    if (feof((FILE *)inFilePtr))
  97.                 result = kMF3DErrReadPartialEOF;
  98.             else
  99.                 result = kMF3DErrReadPartial;
  100.         }
  101.     }
  102.  
  103.     return result;
  104. }
  105.  
  106. MF3DErr
  107. MF3DStdCWriteHook(
  108.     MF3DUserFilePtr        inFilePtr,
  109.     MF3DSize            inCharsToWrite,
  110.     const char *        inBuffer)
  111. {
  112.     size_t    bytesWritten;
  113.     MF3DErr    result;
  114.  
  115.     result = kMF3DNoErr;
  116.     bytesWritten = fwrite(inBuffer, sizeof(char), (size_t)inCharsToWrite,
  117.             (FILE *)inFilePtr);
  118.  
  119.     if (bytesWritten == 0)
  120.     {    if (feof((FILE *)inFilePtr))
  121.             result = kMF3DErrWriteFailedEOF;
  122.         else
  123.             result = kMF3DErrWriteFailed;
  124.     }
  125.     else if (bytesWritten != (size_t)inCharsToWrite)
  126.     {    if (feof((FILE *)inFilePtr))
  127.             result = kMF3DErrWritePartialEOF;
  128.         else
  129.             result = kMF3DErrWritePartial;
  130.     }
  131.  
  132.     return result;
  133. }
  134.  
  135. MF3DErr
  136. MF3DStdCTellHook(
  137.     MF3DUserFilePtr                inFilePtr,
  138.     MF3DBinaryFilePosition *    outPositionPtr)
  139. {
  140.     long    filePosition;
  141.     MF3DErr    result;
  142.  
  143.     result = kMF3DNoErr;
  144.  
  145.     filePosition = ftell((FILE *)inFilePtr);
  146.     if (filePosition != -1L)
  147.     {    Int32ToUns64(filePosition, *outPositionPtr);
  148.     }
  149.     else
  150.     {    result = kMF3DErrTellFailed;
  151.     }
  152.  
  153.     return result;
  154. }
  155.  
  156. MF3DErr
  157. MF3DStdCSeekHook(
  158.     MF3DUserFilePtr            inFilePtr,
  159.     MF3DBinaryFilePosition    inPosition)
  160. {
  161.     MF3DErr                    result;
  162.     long                    longPos;
  163.     int                        fseekResult;
  164.     MF3DBinaryFilePosition    longMax;
  165.  
  166.     result = kMF3DNoErr;
  167.  
  168.     /*
  169.      * Standard C library only allows seeks in the range of a long.
  170.      * If you really want to seek farther, you will have to rewrite
  171.      * this yourself.
  172.      */
  173.     Int32ToUns64(LONG_MAX, longMax);
  174.     if (CompareInt64(inPosition, longMax) > 0)
  175.         result = kMF3DErrSeekOutOfRange;
  176.  
  177.     if (result == kMF3DNoErr)
  178.     {    Uns64ToUns32(inPosition, longPos);
  179.         fseekResult = fseek((FILE *)inFilePtr, longPos, SEEK_SET);
  180.     }
  181.  
  182.     if (fseekResult != 0)
  183.         result = kMF3DErrSeekFailed;
  184.  
  185.     return result;
  186. }
  187.  
  188. MF3DErr
  189. MF3DStdCCloseHook(
  190.     MF3DUserFilePtr        inFilePtr)
  191. {
  192.     int    closeResult;
  193.  
  194.     closeResult = fclose((FILE *)inFilePtr);
  195.  
  196.     return closeResult == 0 ? kMF3DNoErr : kMF3DErrCloseEOF;
  197. }
  198.